基礎から応用までじっくり学ぶECS Fargateを利用したコンテナ環境構築 #Fargate
こんにちはコカコーラ大好き、カジです。
7/3に行われたDevelopers.IO 2020 Connect で、「基礎から応用までじっくり学ぶECS Fargateを利用したコンテナ環境構築」というタイトルで、お話しさせていただきました。 ライブに来ていただいたみなさま、ありがとうございました!
お客様や自社の開発部門から、急に「次のシステムはコンテナ使いたい」と言われ、コンテナ実行環境を構築しなければならない状況に直面し、慣れない部分が多いと思います。 AWSにはコンテナ向けのサービスは複数あり、少人数でも運用しやすいのがECS Fargateです。そんなECS Fargateを中心に、実用的なコンテナ実行環境をどのように構築すれば良いのかについて解説しました。
目次
なぜコンテナ?
- 場所を選ばず動作可能
- 手元のPC、複数のクラウド上
- OSへの依存度を減らし、移植しやすい
- 開発環境の構築がコードベース実施
- 既存の環境に影響を与えず、新しい環境を利用可能
- 既存環境の相乗りとか検討不要
- 開発環境と本番環境の差異が最小限
詳しくはこちら
合わせて読んでおきたい資料
なぜECS Fargate?
- EC2にDockerインストールするだけで利用可能
- 自動的スケーリング出来ない、バージョンアップ面倒、管理対象が増える
- 全部のAWSサービスと連携したい
コンテナオーケストレーション
- 複数コンテナホスト・複数コンテナを管理しやすくする
- ホストサーバーを束ねてクラスタリング
- 効率的なコンテナ配置
- オートヒーリング
- コンテナ周辺のモニタリング/ログ管理
AWSコンテナ関連サービス
コントロールプレーンのざっくり比較
ECSを最初に検討 kubernetesや周辺ツールを学んでいる、これから取り組む予定がある場合は、EKS
データプレーンのざっくり比較
Fargateを最初に検討し、実現できないことがあれば、EC2を検討
ECR
- Amazon Elastic Container Registry
- ECRはAWSが提供しているコンテナイメージ保管場所
- ECRのイメージに対する脆弱性スキャン機能もある
クラスター・サービス・タスクの関連概要図
- ECS クラスタ → 以下のサービスとタスクの器、かたまり
- ECS サービス → タスク(以下)を指定し、何個起動するのか指定、ALBと関連付けするもの
- ECS タスク → CPU/メモリの割り当て、ポート設定などDockerコンテナの起動方法を指定する設定書みたいなもの
構築方法
削除するときはCloudFormationのスタックを削除ください。 また、ECS Fargateをマネージメントコンソールで構築したい方は以下のブログ・動画を参照ください
実際構築してわかったECS Fargateあるある
構築後のタスク再起動
異常時
正常時
原因1:ECR(イメージのURI)への通信経路
原因2:CloudWatch Logs等のログ転送の通信経路
原因3:ALBからのヘルスチェック失敗
コンテナからS3などのAWSサービスが利用したい
データベースとの接続情報は?
- 環境変数で指定
- 本番・検証などの環境定義
- データベース接続情報
- 以下の2つのいずれかを利用して環境変数として取得
- Systems Managerのパラメータストア
- Secrets Manager
指定した時間にコンテナ起動してバッチ処理したい
デプロイ
こちらの同日の別セッションが良いので以下を見てください。
ログ
- awslogsログドライバ
- AWS CloudWatch Logsへ転送
- Splunkログドライバ
- Splunk URL、Splunk トークンパラメータを指定してログ 情報を送信
- FireLens機能を利用で、Fluentdにすることも可能
監視
- CloudWatch Container Insights
- マネージメントコンソールからECS構築時にON
- CloudFormation等で構築済みのECSはAWS CLIで 設定
aws ecs update-cluster-settings --cluster myCICluster --settings name=containerInsights,value=enabled
7/6追記
登壇資料作成時にネットワーク送受信のグラフはECS on EC2のみと説明しましたが、Fargate 1.3.0で試していたため、表示されておりません。 Fargate 1.4.0ですと以下のようにネットワーク送受信が表示されておりました。
応用
検証環境を時間で起動・停止したい
サービスが増えてサービス間で連携していると起きる課題
Dockerコンテナを利用することで、各システムが、マイクロサービス化しやくすなります。ただマイクロサービスでの課題としては以下があります。
- 複雑なサービス間の通信
- サービスや依存関係の発見
- 分散アプリの監視検知
- サービス間の認証・認可
AWS X-Rayでできること
- パフォーマンスボトルネックとエラーの特定
- アプリケーション内の特定サービスへの問題を特定
- アプリケーションのユーザに対する問題のインパクトを特定
- アプリケーションのサービスコールグラフの可視化
あわせて確認しておきたい資料
AWS Black Belt Online Seminar AWS Fargate ストレージのところは必見です。
JAWS-UGコンテナ支部 #17 ECS/Fargate PV 1.4 ローンチ記念! 各社の事例も含まれているので、Youtubeは必見です。
まとめ
- CloudFormationで簡単にECS-Fargate構築
- ECRやCloudWatch Logs、ALBへの通信経路に注意
- AWSリソースを利用する場合、タスクロールとタスク実行ロールに注意
これからコンテナ環境をAWSに構築する際に役立つ資料にしたつもりです。どなたかのお役に立てれば光栄です。
資料
Q&A
Q1.FargateはENIの数を気にせずに使えるのでしょうか?
A1.Fargateは1タスクに独自のENIが1個付与されます。配置先のVPCサブネットの空きに依存します。
Q2.AWSマネジメントコンソールからECSサービスを作成する際、サブネットを2つ選択し、タスクの数を2に設定した場合、結果としてタスクは各サブネットに1つずつ作成されるのでしょうか
A2.タスクの配置方法はタスク起動時のタスク配置設定で指定することが可能です。 https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-placement.html タスク配置条件に沿ってタスクが起動するため、一つずつ配置されます。
Q3.1つのECSサービスに複数タスク(アプリコンテナ・サイドカーコンテナ)が起動しているとき、CloudWatch Container Insightsでアプリコンテナだけのリソース(CPU・メモリ)を取得することは可能でしょうか。
A3.設定ボタンでタスクIDを表示すると、タスク毎のCPU/メモリ使用率は見えますがアプリコンテナだけのCPU/メモリを取得できないようです。